任意大小迷宫自动生成+BFS寻路+生成无损迷宫bitmap(.BMP)图片 您所在的位置:网站首页 迷宫图片复杂 游戏 任意大小迷宫自动生成+BFS寻路+生成无损迷宫bitmap(.BMP)图片

任意大小迷宫自动生成+BFS寻路+生成无损迷宫bitmap(.BMP)图片

2024-05-27 20:34| 来源: 网络整理| 查看: 265

目录标题 迷宫游戏 迷宫的生成 BFS寻找路线 最后的一些细枝末节 如何使用程序 链接 I TURN COFFEE INTO CODE!

800x800迷宫自动解路径 镇楼图 在这里插入图片描述 https://pan.baidu.com/s/1ql-fy9V_vmhQp2huFWhshw 迷宫游戏百度网盘在此

迷宫游戏

本人墨尔本大学大一学生一枚,前段利用暑假在家闲来无事写了一个迷宫游戏。起初只是想锻炼巩固一下BFS,以及链表的知识点,后来逐渐给自己的程序增加了一些自己想要的功能,同时也学习到了很多东西。 主要涉及到了三个部分: 1,迷宫的生成 2,BFS寻找路线,利用队列寻路 3,BMP图片的生成 4,在Console中动态显示BFS求得的路线,运用gotoxy();而不是system(“cls”),避免闪屏。

迷宫的生成

迷宫的生成主要利用了递归分割法,先初始化空白二维矩阵,N by N grid, 递归分割法通俗的说就是在这片空白的区域中砌墙,怎么个砌法呢,就是递归的用墙"切割"这片空白的空间,直到墙和墙之间达到最小的单位宽度,在此也就是一格。 如图所示便是递归分割法: 递归分割法 在这里插入图片描述

BFS寻找路线

BFS是一种寻路的很重要的算法,在该类迷宫中BFS可以找到最优的路径。 通俗的说,BFS在我看来就像是往迷宫的起点灌水(蔓延状的遍历整个图),一旦水到了出口,立刻停止灌水,(也就是增加队列),并且开始回溯路径。 当然,水是不能回溯路径的,而存在链表(队列)中的坐标是可以回溯的。我用的方法是创建了一个结构体,包含了当前x,y坐标以及pre_x,pre_y先前坐标,起点处的先前坐标设为-1,-1,也就是在回溯过程中,一旦先前坐标为-1,停止回溯,之后便得到了完整的BFS路径。 另一个问题, 如果有同样长度的路径到达起点,我们应该选择哪一条呢? 不用担心,在添加队列之前我们就应当设定好了一个方向顺序,比如先看当前坐标的"上",之后是"下",“左”,“右”。而刚刚我已经提到过,既然有顺序可言,并且往迷宫内"灌水"的行为是一旦到达目标终点并停止,那么我们只要回溯就能得到路径,根本就无需考虑相同长度的路径,因为即使它可能存在,但是你回溯路径的选择只有一条路。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

最后的一些细枝末节

程序的主体大概就是如上所说,其他一些琐碎的东西便是将数据存入txt文档并再读取,用于解路线以及画图。 画图我一开始尝试用matlab,非常方便,但是发现打包之后的matlab的exe并不能在其他电脑上通用,而且体积庞大,于是花了一点时间学习了一下BMP图片的生成,并且动手改写了一下这里的代码,归为己有。 https://blog.csdn.net/sguniver_22/article/details/80379457

先给大家看一下我最后生成的bmp图片。这是最大的一只,800x800的,如果一个有一米长 那么这个迷宫便是一平方公里那么大了。 在这里插入图片描述

还有一些小一点的,对浏览者友好。没记错的话这应该就是120x120 图片的单位都是像素。

在这里插入图片描述

如何使用程序

为了方便运行,我没有在源代码中加入过多的system(“balabala”);语句,所以写了一个批处理文件 如下 也就是运行过程。

@echo off color FA title = AUTO MAZE SOLVER mode con cols=120 lines=80 ::设置颜色,大小和标题 ::运行maze.exe会在当前文件夹中生成一个半成品maze.txt储存了block的坐标和迷宫的信息 maze.exe ::如果源文件夹已有迷宫图片自动删除(为了之后生成新的) del MAZE.bmp color F9 ::BFS解迷宫程序输入信息,完善maze.txt为了下一步给创建BMP使用 maze_solver.exe scanf("%d,%d]\n",&y,&x); //block buff[y][x][0] = 0xb0; buff[y][x][1] = 0xb0; buff[y][x][2] = 0xf0; ch=getchar(); } getchar(); //path ch=getchar(); while(ch!='$'){ scanf("%d,%d]\n",&y,&x); buff[y][x][0] = 0; buff[y][x][1] = 0; buff[y][x][2] = 0; ch=getchar(); } getchar(); ch=getchar(); //space while(ch!=EOF){ scanf("%d,%d]\n",&y,&x


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有